package view;

import Controlador.CtlConsulta;
import Model.Estabelecimento;
import Model.Evento;
import Model.Prato;
import interfaces.SugestoesEstabelecimentos;
import interfaces.SugestoesEstabelecimentosService;


import javax.swing.*;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


/**
 * Created with IntelliJ IDEA.
 * User: J-Pac123
 * Date: 4/18/14
 * Time: 2:05 PM
 * To change this template use File | Settings | File Templates.
 */
public class TelaConsulta {

    private JFrame frmConsultaDeEstabelecimentos;
    private JTextField nomeEstabelecimentoTextField;
    private JTable tableEventos;
    private JTable tablePratos;
    private JTable tableResultados;
    private DefaultTableModel tiposEventosModel;
    private DefaultTableModel tiposPratosModel;
    private DefaultTableModel resultadosModel;
    private HashMap<Integer, Integer> mapFromEstabelecimentosIds =  new HashMap<Integer, Integer>();

    /**
     * Create the application.
     */
    public TelaConsulta() {
        ctlConsulta = new CtlConsulta();

        initialize();
    }

    public void displayTelaConsulta() {
        frmConsultaDeEstabelecimentos.setVisible(true);
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frmConsultaDeEstabelecimentos = new JFrame();
        frmConsultaDeEstabelecimentos.setResizable(false);
        frmConsultaDeEstabelecimentos.setTitle("Consulta de Estabelecimentos");
        frmConsultaDeEstabelecimentos.setBounds(100, 100, 596, 763);
        frmConsultaDeEstabelecimentos.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmConsultaDeEstabelecimentos.getContentPane().setLayout(null);
        frmConsultaDeEstabelecimentos.setVisible(true);
        frmConsultaDeEstabelecimentos.setLocationRelativeTo(null);
        frmConsultaDeEstabelecimentos.getContentPane().setLayout(null);



        JLabel lblNewLabel = new JLabel("Cidade");
        lblNewLabel.setBackground(Color.WHITE);
        lblNewLabel.setBounds(25, 8, 108, 14);
        frmConsultaDeEstabelecimentos.getContentPane().add(lblNewLabel);

        JLabel lblNewLabel_1 = new JLabel("Zona");
        lblNewLabel_1.setBounds(228, 8, 108, 14);
        frmConsultaDeEstabelecimentos.getContentPane().add(lblNewLabel_1);

        JLabel lblTipo = new JLabel("Tipo");
        lblTipo.setBounds(421, 8, 119, 14);
        frmConsultaDeEstabelecimentos.getContentPane().add(lblTipo);

        JLabel lblNome = new JLabel("Nome Estabelecimento");
        lblNome.setBounds(25, 75, 201, 14);
        frmConsultaDeEstabelecimentos.getContentPane().add(lblNome);

        JLabel lblAvaliao = new JLabel("Avalia\u00E7\u00E3o");
        lblAvaliao.setBounds(421, 75, 119, 14);
        frmConsultaDeEstabelecimentos.getContentPane().add(lblAvaliao);

        DefaultComboBoxModel cidadesModel = new DefaultComboBoxModel();
        JComboBox comboBox = new JComboBox(cidadesModel);
        comboBox.setBounds(25, 33, 108, 20);
        comboBox.setSelectedIndex(-1);
        frmConsultaDeEstabelecimentos.getContentPane().add(comboBox);
        cidadesModel.insertElementAt("", 0);
        for(String cidade : ctlConsulta.getCidades()) {
            cidadesModel.addElement(cidade);
        }
        comboBox.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                selecionarCidade(null);
                if(!e.getItem().equals("")) {
                    selecionarCidade((String) e.getItem());
                }
            }
        });


        DefaultComboBoxModel zonasModel = new DefaultComboBoxModel();
        JComboBox comboBox_1 = new JComboBox(zonasModel);
        comboBox_1.setBounds(228, 33, 108, 20);
        frmConsultaDeEstabelecimentos.getContentPane().add(comboBox_1);
        zonasModel.insertElementAt("", 0);
        for(String zona : ctlConsulta.getZonas()) {
            zonasModel.addElement(zona);
        }
        comboBox_1.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                selecionarZona(null);
                if(!e.getItem().equals("")) {
                    selecionarZona((String) e.getItem());
                }
            }
        });


        DefaultComboBoxModel tiposModel = new DefaultComboBoxModel();
        JComboBox comboBox_2 = new JComboBox(tiposModel);
        comboBox_2.setBounds(421, 33, 129, 20);
        frmConsultaDeEstabelecimentos.getContentPane().add(comboBox_2);
        tiposModel.insertElementAt("", 0);
        for(String tipo : ctlConsulta.getTipos()) {
            tiposModel.addElement(tipo);
        }
        comboBox_2.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                selecionarTipo(null);
                if(!e.getItem().equals("")) {
                    selecionarTipo((String) e.getItem());
                }
            }
        });

        DefaultComboBoxModel avaliacaoModel = new DefaultComboBoxModel();
        JComboBox comboBox_3 = new JComboBox(avaliacaoModel);
        comboBox_3.setBounds(421, 100, 129, 20);
        frmConsultaDeEstabelecimentos.getContentPane().add(comboBox_3);
        avaliacaoModel.insertElementAt("", 0);
        for (int i = 1; i <= 5; i++) {
            avaliacaoModel.addElement(i);
        }
        comboBox_3.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                preencherAvaliacao(0);
                if(!e.getItem().equals("")) {
                    preencherAvaliacao((Integer) e.getItem());
                }
            }
        });

        nomeEstabelecimentoTextField = new JTextField();
        nomeEstabelecimentoTextField.setBounds(25, 100, 327, 20);
        frmConsultaDeEstabelecimentos.getContentPane().add(nomeEstabelecimentoTextField);
        nomeEstabelecimentoTextField.setColumns(10);
        nomeEstabelecimentoTextField.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public void keyPressed(KeyEvent e) {
                //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public void keyReleased(KeyEvent e) {
                preencherNome(nomeEstabelecimentoTextField.getText());
            }
        });

        final JPanel panel = new JPanel();
        panel.setBounds(10, 146, 256, 306);
        frmConsultaDeEstabelecimentos.getContentPane().add(panel);
        panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        panel.setLayout(null);

        JLabel lblTipoDeEventos = new JLabel("Tipo de Eventos");
        lblTipoDeEventos.setHorizontalAlignment(0);
        lblTipoDeEventos.setBounds(10, 0, 230, 14);
        panel.add(lblTipoDeEventos/*, gbc*/);

        tiposEventosModel = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int row, int column) {
                return column != 0;
            }
        };
        tableEventos = new JTable(tiposEventosModel);
        tableEventos.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        tiposEventosModel.setColumnIdentifiers(new String[]{"Tipo de Eventos", "Eliminar"});
        panel.setLayout(null);
//        gbc.gridy += 150;
        JScrollPane scrollPane = new JScrollPane(tableEventos);
        scrollPane.setBounds(10, 31, 230, 194);
        panel.add(scrollPane/*, gbc*/);
        TableColumn col2 = tableEventos.getColumnModel().getColumn(1);
        col2.setCellEditor(tableEventos.getDefaultEditor(Boolean.class));
        col2.setCellRenderer(tableEventos.getDefaultRenderer(Boolean.class));
        tiposEventosModel.addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {
                if(e.getColumn() == 1) {
                    tiposEventosModel.removeRow(e.getFirstRow());
                }
            }
        });
        tableEventos.doLayout();


        final DefaultComboBoxModel tiposEventosComboModel = new DefaultComboBoxModel();
        final JComboBox tiposEventosComboBox = new JComboBox(tiposEventosComboModel);
        tiposEventosComboBox.setBounds(10, 236, 230, 20);
        panel.add(tiposEventosComboBox);
        tiposEventosComboBox.setForeground(Color.BLACK);
        tiposEventosComboBox.setBackground(UIManager.getColor("CheckBox.background"));
        tiposEventosComboModel.insertElementAt("", 0);
        for(String tipoEvento : Evento.obterTiposEventos()) {
            tiposEventosComboModel.addElement(tipoEvento);
        }

        JButton btnAdicionarEvento = new JButton("Adicionar Evento");
        btnAdicionarEvento.setBounds(10, 267, 230, 23);
        panel.add(btnAdicionarEvento);
        btnAdicionarEvento.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(tiposEventosComboBox.getSelectedIndex() != 0 && tiposEventosComboBox.getSelectedIndex() != -1) {
                    adicionarEvento((String) tiposEventosComboBox.getSelectedItem());
                }
            }
        });

        JPanel panel_1 = new JPanel();
        panel_1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        panel_1.setLayout(null);
        panel_1.setBounds(322, 146, 251, 306);
        frmConsultaDeEstabelecimentos.getContentPane().add(panel_1);

        JLabel lblTipoDePratos = new JLabel("Tipo de Pratos");
        lblTipoDePratos.setHorizontalAlignment(SwingConstants.CENTER);
        lblTipoDePratos.setBounds(10, 0, 230, 14);
        panel_1.add(lblTipoDePratos);

        tiposPratosModel = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int row, int column) {
                return column != 0;
            }
        };
        tablePratos = new JTable(tiposPratosModel);
        tableEventos.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        tiposPratosModel.setColumnIdentifiers(new String[]{"Tipos de Prato", "Eliminar"});
        JScrollPane scrollPane1 = new JScrollPane(tablePratos);
        scrollPane1.setBounds(10, 31, 230, 194);
        panel_1.add(scrollPane1);
        TableColumn col2p = tablePratos.getColumnModel().getColumn(1);
        col2p.setCellEditor(tableEventos.getDefaultEditor(Boolean.class));
        col2p.setCellRenderer(tableEventos.getDefaultRenderer(Boolean.class));
        tiposPratosModel.addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {
                if(e.getColumn() == 1) {
                    tiposPratosModel.removeRow(e.getFirstRow());
                }
            }
        });
        tablePratos.doLayout();

        DefaultComboBoxModel tiposPratosComboModel = new DefaultComboBoxModel();
        final JComboBox tiposPratosComboBox = new JComboBox(tiposPratosComboModel);
        tiposPratosComboBox.setForeground(Color.BLACK);
        tiposPratosComboBox.setBackground(UIManager.getColor("CheckBox.background"));
        tiposPratosComboBox.setBounds(10, 241, 231, 20);
        panel_1.add(tiposPratosComboBox);
        tiposPratosComboModel.insertElementAt("", 0);
        for(String tipoPrato : Prato.obterTiposPratos()) {
            tiposPratosComboModel.addElement(tipoPrato);
        }

        JButton btnAdicionarPrato = new JButton("AdicionarPrato");
        btnAdicionarPrato.setBounds(10, 272, 231, 23);
        panel_1.add(btnAdicionarPrato);

        btnAdicionarPrato.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(tiposPratosComboBox.getSelectedIndex() != 0 && tiposPratosComboBox.getSelectedIndex() != -1) {
                    adicionarPrato((String) tiposPratosComboBox.getSelectedItem());
                }
            }
        });


        JButton btnAplicarFiltro = new JButton("Aplicar Filtro");
        btnAplicarFiltro.setBounds(56, 462, 170, 23);
        frmConsultaDeEstabelecimentos.getContentPane().add(btnAplicarFiltro);
        btnAplicarFiltro.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                aplicarFiltro();
            }
        });

        JButton btnTodosOsEstabelecimentos = new JButton("Todos os Estabelecimentos");
        btnTodosOsEstabelecimentos.setBounds(370, 462, 170, 23);
        frmConsultaDeEstabelecimentos.getContentPane().add(btnTodosOsEstabelecimentos);
        btnTodosOsEstabelecimentos.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pesquisaSemFiltro();
            }
        });

        JPanel panel_2 = new JPanel();
        panel_2.setLayout(null);
        panel_2.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        panel_2.setBounds(10, 503, 563, 145);
        frmConsultaDeEstabelecimentos.getContentPane().add(panel_2);

        JLabel lblResultadosEstabelecimentos = new JLabel("Resultados de Pesquisa");
        lblResultadosEstabelecimentos.setHorizontalAlignment(SwingConstants.CENTER);
        lblResultadosEstabelecimentos.setLocation(10, 0);
        lblResultadosEstabelecimentos.setSize(543, 26);
        //lblTipoDeEventos.setBounds(0, 0, 230, 200);
        panel_2.add(lblResultadosEstabelecimentos);

        resultadosModel = new DefaultTableModel();
        tableResultados = new JTable(resultadosModel);
        tableResultados.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        resultadosModel.setColumnIdentifiers(new String[] {"Nome", "Zona", "Avaliação"});
        JScrollPane scrollPane2 = new JScrollPane(tableResultados);
        scrollPane2.setBounds(10, 25, 543, 109);
        tableResultados.doLayout();
        panel_2.add(scrollPane2);


        JButton btnVerDetalhes = new JButton("Ver Detalhes");
        btnVerDetalhes.setBounds(20, 659, 144, 23);
        frmConsultaDeEstabelecimentos.getContentPane().add(btnVerDetalhes);
        btnVerDetalhes.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(tableResultados.getSelectedRow() != -1) {
                    new FormularioDetalhes(mapFromEstabelecimentosIds.get(tableResultados.getSelectedRow()));
                }
                System.out.println("Selected index: " + tableResultados.getSelectedRow() + " Selected id: " + mapFromEstabelecimentosIds.get(tableResultados.getSelectedRow()));
            }
        });

        // Modificado -- acrescentado pois não foi especificado
        btnVerDetalhes.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });

        JButton btnSair = new JButton("Sair");
        btnSair.setBounds(474, 659, 97, 23);
        frmConsultaDeEstabelecimentos.getContentPane().add(btnSair);
        btnSair.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int result = JOptionPane.showConfirmDialog(
                        frmConsultaDeEstabelecimentos,
                        "Are you sure you want to exit the application?",
                        "Exit Application",
                        JOptionPane.YES_NO_OPTION);

                if (result == JOptionPane.YES_OPTION) {
                    frmConsultaDeEstabelecimentos.dispatchEvent(new WindowEvent(frmConsultaDeEstabelecimentos, WindowEvent.WINDOW_CLOSING));
                }
            }
        });
    }

    private Estabelecimento[] estabelecimentos;

    private CtlConsulta ctlConsulta;

    private String cidadeSelecionada;
    private String zonaSelecionada;
    private String tipoSelecionado;
    private boolean comFotografia;
    private int avaliacao;
    private String nome = "";


    // PESQUISA COM FILTRO
    public void adicionarEvento(String evento) {
        tiposEventosModel.addRow(new Object[] {evento, false});

    }

    public void adicionarPrato(String prato) {
        tiposPratosModel.addRow(new Object[] {prato, false});
    }

    // Inutilizado
    public void comFotografia(boolean comFotografia) {
        this.comFotografia = comFotografia;
    }

    public void preencherAvaliacao(int avaliacao) {
        this.avaliacao = avaliacao;
    }

    public void preencherNome(String nome) {
        this.nome = nome;
    }

    public void selecionarCidade(String cidade) {
        cidadeSelecionada = cidade;
    }

    public void selecionarTipo(String tipo) {
        tipoSelecionado = tipo;
    }
    public void selecionarZona(String zona) {
        zonaSelecionada = zona;
    }

    // Inutilizado
    public void selectCidades() {
    }

    // Inutilizado
    public void selectTipos() {
    }

    // Inutilizado
    public void selectZonas() {
    }

    // Modificado -- a enviar tipos de eventos e de pratos pelos argumentos acrescentados ao metodo do controlador
    public void aplicarFiltro() {
        List<String> tiposEvento = new ArrayList<String>();
        List<String> tiposPrato = new ArrayList<String>();

        for (int i = 0; i < tiposEventosModel.getRowCount(); i++) {
            tiposEvento.add((String) tiposEventosModel.getValueAt(i, 0));
        }
        for (int i = 0; i < tiposPratosModel.getRowCount(); i++) {
            tiposPrato.add((String) tiposPratosModel.getValueAt(i, 0));
        }

        estabelecimentos = ctlConsulta.aplicarFiltro(tipoSelecionado, comFotografia, avaliacao, nome, cidadeSelecionada, zonaSelecionada, tiposPrato, tiposEvento);

        display(estabelecimentos);
    }

    // PESQUISA SEM FILTRO
    public void pesquisaSemFiltro() {
        estabelecimentos = ctlConsulta.selectAll();

        display(estabelecimentos);
    }

    public void display(Estabelecimento[] estabelecimentos) {
        if (resultadosModel.getRowCount() > 0) {
            for (int i = resultadosModel.getRowCount() - 1; i > -1; i--) {
                resultadosModel.removeRow(i);
            }
        }
        mapFromEstabelecimentosIds.clear();
        for(Estabelecimento estabelecimento : estabelecimentos) {
            System.out.println("Result from aplicarFiltro: " + estabelecimento.getNome());
            resultadosModel.addRow(new Object[] {estabelecimento.getNome(), estabelecimento.getZona(), estabelecimento.getAvaliacao()});
            mapFromEstabelecimentosIds.put(resultadosModel.getRowCount() - 1, estabelecimento.getId());
        }
    }

    /**
     * Launch the application. with champoo
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    new TelaConsulta();
                    //System.out.println("lifeSignal: " + SugestoesEstabelecimentosService.getInstance().getLifeSignal());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

}
